package emailclient;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.JDialog;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.mail.*;
import javax.swing.*;

/**
 * @class MessageDialog
 * @brief Диалоговое окно создания сообщения.
 * 
 * Этот класс отображает диалоговое окно, используемое при создании сообщений
 * @author Kazakov A.V.
 * @version 1.0
 */
public class MessageDialog extends JDialog
{
	/**
	 * идентификатор нового сообщения
	 */
	public static final int NEW = 0;
	/**
	 * ответное сообщение
	 */
	public static final int REPLY = 1;
	/**
	 * перенаправить сообщение
	 */
	public static final int FORWARD = 2;

	/**
	 * текстовое поле для сообщения "от"
	 */
	private JTextField fromTextField;
	/**
	 * текстовое поле для сообщения "для"
	 */
	private JTextField toTextField;
	/**
	 * текстовое поле для сообщения "предмет"
	 */
	private JTextField subjectTextField;

	/**
	 * текстовое поле для содержимого сообщения
	 */
	private JTextArea contentTextArea;

	/**
	 * флаг, указывающий о закрытии диалогового окна
	 */
	private boolean cancelled;

	public MessageDialog(Frame parent, int type, Message message)
			throws Exception
	{
		// вызов суперконструктора, определение диалогового окна как модального
		super(parent, true);

		// установить заголовок для окна и получить значения полей
		String to = "";
		String subject = "";
		String content = "";

		switch(type)
		{
			// ответить на сообщение
			case REPLY:
				setTitle("Reply To Message");

				//	получить значение "to"
				Address[] senders = message.getFrom();
				if(senders != null || senders.length > 0)
				{
					to = senders[0].toString();
				}
				to = message.getFrom()[0].toString();

				// получить тему сообщения
				subject = message.getSubject();
				if(subject != null && subject.length() > 0)
				{
					subject = "RE: " + subject;
				}
				else
				{
					subject = "RE:";
				}

				// получить содержимое сообщения и добавить запись
				// "REPLIED TO"
				content =	"\n--------------- " +
							"REPLIED TO MESSAGE" + 
							" -----------------\n" +
							EmailClient.getMessageContent(message);
				break;

			// перенаправить сообщение	
			case FORWARD:
				setTitle("Forward Message");

				// получить тему сообщения
				subject = message.getSubject();
				if(subject != null && subject.length() >0)
				{
					subject = "FWD: " + subject;
				}
				else
				{
					subject = "FWD:";
				}

				// получить содержимое сообщения и добавить
				// запись "FORWARDED"
				content =	"\n--------------- " + 
							"FORWARDED MESSAGE" + 
							" ---------------\n" + 
							EmailClient.getMessageContent(message);
				break;

			// новое сообщение
			default:
				setTitle("New Message");
		}

		// обработать событие при закрытии
		addWindowListener(new WindowAdapter() 
		{
			@Override
			public void windowClosing(WindowEvent e)
			{
				actionCancel();
			}
		});

		// установить поля панели
		JPanel fieldsPanel = new JPanel();
		GridBagConstraints	constraints;
		GridBagLayout	layout = new GridBagLayout();
		fieldsPanel.setLayout(layout);

		JLabel	fromLabel = new JLabel("From:");
		constraints = new GridBagConstraints();
		constraints.anchor = GridBagConstraints.EAST;
		constraints.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(fromLabel, constraints);
		fieldsPanel.add(fromLabel);

		fromTextField = new JTextField();
		constraints = new GridBagConstraints();
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(fromTextField, constraints);
		fieldsPanel.add(fromTextField);

		JLabel	toLabel = new JLabel("To:");
		constraints = new GridBagConstraints();
		constraints.anchor = GridBagConstraints.EAST;
		constraints.insets = new Insets(5, 5, 0, 0);
		layout.setConstraints(toLabel, constraints);
		fieldsPanel.add(toLabel);

		toTextField = new JTextField(to);
		constraints = new GridBagConstraints();
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.insets = new Insets(5, 5, 0, 0);
		constraints.weightx = 1.0D;
		layout.setConstraints(toTextField, constraints);
		fieldsPanel.add(toTextField);

		JLabel	subjectLabel = new JLabel("Subject:");
		constraints = new GridBagConstraints();
		constraints.insets = new Insets(5, 5, 5, 0);
		layout.setConstraints(subjectLabel, constraints);
		fieldsPanel.add(subjectLabel);

		subjectTextField = new JTextField(subject);
		constraints = new GridBagConstraints();
		constraints.fill = GridBagConstraints.HORIZONTAL;
		constraints.gridwidth = GridBagConstraints.REMAINDER;
		constraints.insets = new Insets(5, 5, 5, 0);
		layout.setConstraints(subjectTextField, constraints);
		fieldsPanel.add(subjectTextField);

		//	установить панель содержимого
		JScrollPane	contentPanel = new JScrollPane();
		contentTextArea = new JTextArea(content, 10, 50);
		contentPanel.setViewportView(contentTextArea);

		//	установить панели кнопок
		JPanel buttonsPanel = new JPanel();
		JButton	sendButton = new JButton("Send");
		sendButton.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				actionSend();
			}
		});
		buttonsPanel.add(sendButton);

		JButton	cancelButton = new JButton("Cancel");
		cancelButton.addActionListener(new ActionListener()
		{
			@Override
			public void actionPerformed(ActionEvent e)
			{
				actionCancel();
			}
		});
		buttonsPanel.add(cancelButton);

		//	добавить отображение панелей
		getContentPane().setLayout(new BorderLayout());
		getContentPane().add(fieldsPanel, BorderLayout.NORTH);
		getContentPane().add(contentPanel, BorderLayout.CENTER);
		getContentPane().add(buttonsPanel, BorderLayout.SOUTH);

		//	оптимизировать размеры
		pack();

		//	центрировать диалоговое окно в приложении
		setLocationRelativeTo(parent);
	}

	/**
	 * проверка и закрытие диалогового окна
	 */
	private void actionSend()
	{
		if(fromTextField.getText().trim().length() < 1
				|| toTextField.getText().trim().length() < 1
				|| subjectTextField.getText().trim().length() < 1
				|| contentTextArea.getText().trim().length() < 1)
		{
			JOptionPane.showMessageDialog(this, 
					"One or more fields is missing.", 
					"Missing Field(s)", 
					JOptionPane.ERROR_MESSAGE);
			return;
		}

		//	закрытие диалогового окна
		dispose();
	}

	/**
	 * Прервать создание мообщения и закрыть диалоговое окно
	 */
	private void actionCancel()
	{
		cancelled = true;

		//	закрытие диалогового окна
		dispose();
	}

	/**
	 * показать диалоговое окно
	 * @return возврат, если отображение произошло с ошибкой
	 */
	public boolean display()
	{
		show();

		return	!cancelled;
	}

	/**
	 * получить сообщение "From"
	 * @return значение поля "From"
	 */
	public String getFrom()
	{
		return	fromTextField.getText();
	}

	/**
	 * получить сообщение "To"
	 * @return возвращает значение текстового поля "To"
	 */
	public String getTo()
	{
		return	toTextField.getText();
	}

	/**
	 * получить значение поля "Subject"
	 * @return значение поля "Subject"
	 */
	public String getSubject()
	{
		return	subjectTextField.getText();
	}

	/**
	 * получить значение поля "content" для сообщения
	 * @return значение поля "content"
	 */
	public String getContent()
	{
		return	contentTextArea.getText();
	}
}
